Chapter 11 THE CHARACTER AND STRING TYPE A QUICK REVIEW OF THE CHARACTER TYPE _________________________________________________________________ The best way to study any topic is with an =============== example, so examine the program named CHARS.ADA CHARS.ADA for some examples using the CHARACTER type =============== variables. The type CHARACTER is a predefined type in Ada and is defined as the printable set of ASCII characters including a few that don't actually print. See appendix C of the LRM for a complete list of the CHARACTER elements. All of the operations available with the enumerated type variable are available with the CHARACTER type variable. To illustrate their use, we declare two CHARACTER type variables in lines 7 and 8 with the second being initialized to the letter D. Note the single quote marks which define the CHARACTER type constant to which the variable named Another is initialized. A different constant value is assigned to the variable My_Char in line 12, and the two variables are compared in the if statement. Since 'A' is of lesser value than 'D', the line of text in line 14 is output to the monitor. Lines 17 through 20 display some very predictable output that is included as an example of CHARACTER output, and finally some of the attributes available with the CHARACTER type variable are illustrated in lines 22 through 24. The same attributes are defined for the CHARACTER type variable as for the enumerated type and all are listed in appendix A of the LRM. Compile and execute this program to get a feel for use of the CHARACTER type variable. You may wish to review the program named MOREDERS.ADA in chapter 7 to refresh your mind on declaring subtypes and derived types of the predefined CHARACTER type. THE STRING TYPE _________________________________________________________________ The program named STRING1.ADA illustrates some =============== of the operations that can be done with the STRING1.ADA predefined type STRING. A string is an array of =============== CHARACTER type variables which is of a fixed length and starts with element number 1 or higher. The index uses type POSITIVE. Note that this program is called STRING1.ADA instead of the more desirable name of STRING.ADA because the word STRING is a predefined word in Ada and using it for the program name would make it unavailable for its correct use. Page 11-1 Chapter 11 - The Character and String Type Line 7 declares an uninitialized string of 33 characters, while line 8 declares a constant string of four elements initialized to the word "John", and illustrates rather graphically that the string is composed of individual CHARACTER type elements. Line 9 declares another constant that is initialized, which all constants must be in order to be useful. Note that lines 8 and 9 did not contain a character count, the computer counted the characters for us and supplied the limits of the array. DECLARING A STRING VARIABLE _________________________________________________________________ Line 10 defines a STRING variable, which will be initialized to the string given. Even though the initialization string is given, the array limits must be explicitly specified for a variable. Not only must the limits be given, the number of elements in the initialization string must agree with the number of elements defined as the array range, or a compiler error will be given. This is the first difficulty encountered when using strings, but there will be more as we progress. It seems like the computer should be able to count the characters in the variable for us, but due to the strong type checking used in Ada, this cannot be done. STRING MANIPULATION IS DIFFICULT _________________________________________________________________ When we get to the executable part of the program, we assign a string constant to the string variable named Line. Once again, according to the definition of Ada, the string constant must have exactly the same number of characters as the number of characters in the declaration of the variable Line, or a compile error will be issued. This is another seemingly unnecessary inconvenience in the use of strings which we must put up with. The variable named Line is displayed on the monitor in line 18, and some of the other constants are displayed along with it. Note that the string constant in line 21 is simply another string constant, but it does not have a name. Finally, we assign a few individual elements of the string variable named Address in such a way to illustrate that it is indeed an array, then do a slice assignment, and finally output the result. It should be noted that the Put_Line could be used in lines 30 and 31 instead of the two separate output procedure calls, but it is simply a matter of personal taste. Compile and run this program and see that the output is exactly what you predict from your understanding of the program. Page 11-2 Chapter 11 - The Character and String Type CONCATENATION OF STRINGS _________________________________________________________________ Examine the program CONCAT.ADA for several ================ examples of string concatenation. Two CONCAT.ADA uninitialized string variables are declared in ================ lines 7 and 8, and they are used throughout the program. Line 12 illustrates concatenation of a three element string and a four element string by using the concatenation operator, the "&". The four element string is appended to the end of the three element string forming a seven element string which is assigned to the variable String7. Line 21 illustrates concatenation of a four element variable with a three element constant. Line 24 is the most interesting assignment here, because it is a concatenation of four strings, two of which contain only one element each. The values of "CR" and "LF" are such that they produce a "carriage return" and "line feed" when sent to the monitor, so that when String7 is output, it will be on two successive lines of the monitor. The ASCII values of all of the characters are available in the predefined package named ASCII, which is why the dotted notation gives the actual value of these constants. Use of the dot notation in this manner will be more fully defined later in this tutorial. Be sure to compile and run this program, and be sure you understand the results. STRING COMPARISONS _________________________________________________________________ The example program named STRNGCMP.ADA will give ================ you some examples of string comparisons as used STRNGCMP.ADA in Ada, so you should examine it at this time. ================ The string declarations are nothing new to you, so nothing more will be said about them. In line 15 where the constants MY_CAR and YOUR_CAR are compared for inequality, they will not be equal since the case is different for some of the characters, and case matters in a string expression. A different ASCII value is used for the letter 'A' than that used for the letter 'a', so they are not the same. For a string comparison to be equal, all elements must be exactly the same as the corresponding elements in the other string, and the number of elements must be the same. Therefore, following execution of line 19, the value assigned to Her_Car is still not the same as the value stored in the constant MY_CAR. If you attempted to compare them, you would get a compile error because the two strings have a different length, so they could never compare anyway. Line 24 illustrates that a variable can be compared to a string literal. Page 11-3 Chapter 11 - The Character and String Type Lines 20 through 22 are examples of legal statements according to the Ada definition. Compile and run this program and study the resulting output. ATTRIBUTES OF CHARACTERS AND STRINGS _________________________________________________________________ Examine the program named CHARINT.ADA for =============== examples of how you can convert from CHARACTER CHARINT.ADA type variables to INTEGER type variables and =============== back. The attributes POS and VAL are used as shown. In order to increment a character, for example an 'A', to the next value, it must be converted to INTEGER, incremented, then converted back to CHARACTER. Of course you could always use the SUCC attribute to increment the CHARACTER type variable. This program should be self explanatory. after you study it, compile and run it. DYNAMIC STRINGS ARE COMING _________________________________________________________________ You may not feel too good about the use of strings in Ada because of the lack of flexibility, but don't worry about them. Ada was written to be an extendable language and when we get to chapter 16, we will have an example package that will give you the ability to use strings the way you would like to. A rather extensive dynamic string package will be presented to you and you will have the ability to refine it even further if you so desire. In effect, you will have the ability to extend the Ada language. PROGRAMMING EXERCISES _________________________________________________________________ 1. Write a program to declare your first name as a STRING constant, and your last name as another STRING constant. Concatenate your first and last names with a blank between them and display the result with a single Put_Line. You will find much inflexibility in the definition of the STRING variable you use for the result. 2. Add code to CHARINT.ADA to increment the variable named Char by using the POS and VAL attributes. Then add additional code to increment the same variable through use of the SUCC attribute. Page 11-4